home *** CD-ROM | disk | FTP | other *** search
- Path: abcfd20.larc.nasa.gov!amiga-request
- From: amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
- Subject: v90i272: StopClick - stop empty drives clicking with SetCPU FASTROM, Part01/01
- Reply-To: isuihko@ujocs.joensuu.fi (Ismo Suihko)
- Newsgroups: comp.sources.amiga
- Message-ID: <comp.sources.amiga:v90i272@abcfd20.larc.nasa.gov>
- Date: 10 Oct 90 01:23:26 GMT
- Approved: tadguy@uunet.UU.NET (Tad Guy)
- X-Mail-Submissions-To: amiga@uunet.uu.net
- X-Post-Discussions-To: comp.sys.amiga
-
- Submitted-by: isuihko@ujocs.joensuu.fi (Ismo Suihko)
- Posting-number: Volume 90, Issue 272
- Archive-name: util/stopclick/part01
-
- [ uuencoded executable enclosed ...tad ]
-
- This program, StopClick, will stop the clicking of empty drives if you
- are using SetCPU1.6 (by Dave Haynie) to load KS 1.3 ROM image to fast
- 32-bit ram. It works even if you are using TDPatch13 from CrossDos.
- StopClick also fixes trackdisk read/write bug (just like NoClick did).
- Before trying to do any patches, StopClick will check if the system has
- a MMU, and after that it checks if the ROM image in 32-bit RAM is the
- correct one (KS 1.3). So it is safe to put this after SetCPU FASTROM in
- startup-sequence, even if you sometimes reboot your Amiga on 68000 mode
- or use other versions of Kickstarts.
-
- #!/bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 1 (of 1)."
- # Contents: Makefile README.1st StopClick.a StopClick.uu readme
- # Wrapped by tadguy@abcfd20 on Tue Oct 9 21:23:24 1990
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'Makefile' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'Makefile'\"
- else
- echo shar: Extracting \"'Makefile'\" \(213 characters\)
- sed "s/^X//" >'Makefile' <<'END_OF_FILE'
- X# Makefile for StopClick 04-Aug-90 by Ismo Suihko
- X
- XStopClick : StopClick.o
- X Blink StopClick.o to StopClick
- X
- X# I: is assigned to include-directory
- XStopClick.o : StopClick.a
- X Assem StopClick.a -o StopClick.o -i I:
- X
- END_OF_FILE
- if test 213 -ne `wc -c <'Makefile'`; then
- echo shar: \"'Makefile'\" unpacked with wrong size!
- fi
- # end of 'Makefile'
- fi
- if test -f 'README.1st' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'README.1st'\"
- else
- echo shar: Extracting \"'README.1st'\" \(436 characters\)
- sed "s/^X//" >'README.1st' <<'END_OF_FILE'
- XThis program will stop clicking of empty disk drives, if you
- Xare using SetCPU1.6 FASTROM to load KS1.3 image to fast 32-bit RAM.
- X
- XI have tested it only on my system (with A2620), so I can't say absolutely
- Xsure that it works also on other systems on which you can use FASTROM, but I
- Xstrongly believe that there aren't any problems.
- XPlease email any comments to the following address, thanks.
- X
- X isuihko@ujocs.joensuu.fi (Ismo Suihko)
- END_OF_FILE
- if test 436 -ne `wc -c <'README.1st'`; then
- echo shar: \"'README.1st'\" unpacked with wrong size!
- fi
- # end of 'README.1st'
- fi
- if test -f 'StopClick.a' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'StopClick.a'\"
- else
- echo shar: Extracting \"'StopClick.a'\" \(9658 characters\)
- sed "s/^X//" >'StopClick.a' <<'END_OF_FILE'
- X* StopClick version 1.0 for SetCPU1.6 users
- X* Written by Ismo Suihko, August 4, 1990 (isuihko@ujocs.joensuu.fi)
- X* Released to the Public Domain
- X*
- X* Routines _GetMMUType and TestFlags are borrowed from SetCPU1.6,
- X* which is written by Dave Haynie.
- X* Also include file setcpu.i is borrowed from SetCPU sources.
- X*
- X* Stops clicking of empty drives by patching 1.3 KS V34.5 ROM (check
- X* it with command 'version') image loaded in 2-bit RAM with
- X* 'SetCPU FASTROM'. Disk drive heads will after the patch be stepped
- X* (silently) in a negative rather than positive direction during the
- X* regular system checks for a disk change.
- X* Version 1.6 of SetCPU isn't doing that patch anymore.
- X* StopClick also fixes trackdisk read/write bug (just like NoClick did).
- X* This patching is possible, because ROM image isn't protected at all.
- X* StopClick does nothing, if there isn't MMU and the given address
- X* doesn't seem to contain right version of the ROM image, so it
- X* is safe to run this even if you sometimes boot on 68000 mode.
- X*
- X* Based on the NoClick program, which is written by Norman Iscove.
- X* It didn't work on my system, because of SetPatch and TDpatch13
- X* (TDpatch13 comes with CrossDos (a great product!)).
- X*
- X* USAGE:
- X* First check the address of the KERNEL by using command 'SetCPU VERBOSE'
- X* If you have A2620 or A2630 with 2 MB 32-bit RAM, then output may
- X* contain this line
- X* KERNEL: (PADDR: $ 3a0000) (VADDR: $ fc0000) (SIZE: 256K)
- X* ^^^^^^
- X* Then give that address as a parameter to StopClick, like
- X* StopClick 3a0000 ;(you can use numbers 0-9 and letters A-F and a-f)
- X* Don't put '$' before the address, because it is used by shell.
- X* Put StopClick to a startup-sequence after SetCPU FASTROM when you have
- X* checked what the address of the KERNEL is. If you add there more memory,
- X* you have to check the address again and do modifications if necessary.
- X*
- X* e.g.
- X* SetCPU FASTROM
- X* stopclick 3a0000 ; KERNEL is at address $3a0000
- X*
- X* There aren't any checks if there is a FASTROM image REALLY IN USE.
- X* We only check, if there are signs of a 1.3 KS V34.2 ROM image..
- X* If FASTROM has been actice once, but then disactivated, the image could
- X* still be in the 32-bit RAM, so it is found from there, and patches are
- X* made but without any effect (and no harm either).
- X*
- X* Return codes:
- X* 0 complete success, fixes made now or they had been made earlier
- X* 5 no MMU (Memory Management Unit)
- X* 10 no KS ROM image found, or wrong version of ROM
- X* 15 KS ROM image found, but modifications couldn't be done??
- X* 99 invalid parameter
- X* We get return code 5 always if there isn't a MMU.
- X*
- X* BUGS:
- X* No known bugs.
- X* Maybe the address of KERNEL could be found by this program somehow...
- X*
- X* Sometimes clicking will end only after a couple of seconds, just like
- X* with NoClick. Don't ask me why it happens so, as I don't know.
- X* And there may be some odd floppy disk drives which don't like to step
- X* in a negative direction. I haven't yet heard anyone who owns such a drive.
- X*
- X* History:
- X* V0.9 Jun 23, 1990 works, do we need more?
- X* V1.0 Aug 04, 1990 some more checking, now we check if there is a MMU,
- X* earlier we checked only if there was a '020 or better.
- X* program is now 480 bytes long
- X* V?.? ??? ??, ???? will find the address of the ROM image by itself
- X*
- X* To compile first get the setcpu.i include file from the SetCPU1.6 sources,
- X* comment out (add ';'s) the last two lines containing the text
- X* ; machine mc68020
- X* ; mc68881
- X* and then compile with commands
- X* Assem StopClick.a -o StopClick.o -i INC:
- X* Blink StopClick.o to StopClick
- X* Makefile is also provided for easier compilation and linking.
- X
- X
- X* exec.library routines
- XLVODisable EQU -120
- XLVOEnable EQU -126
- XLVOCloseLibrary EQU -414
- XLVOOpenLibrary EQU -552
- X* dos.library routines
- XLVOWrite EQU -48
- XLVOOutput EQU -60
- X
- X* some macros, etc.
- X include "setcpu.i"
- X
- X
- X movem.l d0/a0,-(sp) save information of command line parameters
- X
- X bsr _GetMMUType
- X tst.l d0 is there a MMU? 68851 or 68030?
- X bne.s scan
- X* no MMU
- X addq.l #8,sp forget parameters before quitting
- X moveq #5,d0 no MMU
- X bra exit
- X
- Xscan
- X movem.l (sp)+,d0/a0
- X* Now check, if there is a valid hexadesimal address given
- X subq.l #1,d0 take out end of line (null)
- X beq.s scan_err is there any parameters at all
- X
- X subq.l #1,d0 counter (length of the parameter)
- X moveq #0,d1 result
- X moveq #0,d2 character from the command line
- Xscan_loop
- X move.b (a0)+,d2 get a character from the command line
- X
- X cmpi.b #' ',d2 check for the end of hex number
- X beq.s scan_ready is it a space
- X cmpi.b #';',d2
- X beq.s scan_ready is it a start of a comment
- X cmpi.b #9,d2
- X beq.s scan_ready is it a tab
- X
- X moveq #'0',d3
- X cmpi.b #'9',d2
- X ble.s scan_number
- X bclr.l #5,d2 [a-f] -> [A-F]
- X cmpi.b #'A',d2
- X blt.s scan_err less than 'A'
- X cmpi.b #'F',d2
- X bgt.s scan_err greater than 'F'
- X moveq #'A'-10,d3
- Xscan_number
- X sub.b d3,d2
- X blt.s scan_err less than '0'
- X asl.l #4,d1 multiply by $10
- X add.l d2,d1
- X dbra d0,scan_loop
- Xscan_ready
- X tst.w d1 should be of form xxxx0000
- X beq.s check
- X
- Xscan_err
- X moveq #99,d0
- X bra.s exit
- X
- Xcheck
- X movea.l d1,a2 address of possible ROM image
- X
- X* Now check if the given address may contain ROM image with exec of V34.2
- X cmpi.w #' 3',$1c(a2)
- X bne.s bad_rom
- X cmpi.l #'4.2 ',$1e(a2)
- X bne.s bad_rom
- X
- X* add offset of trackdisk.device, should be of version 34.1
- X adda.l #$29564,a2
- X cmpi.l #'34.1',$36(a2)
- X beq.s patch
- Xbad_rom
- X moveq #10,d0 no ROM image found
- X bra.s exit
- X
- Xpatch
- X moveq #2,d7 2 patches
- X* disable interrupts
- X CALLSYS Disable
- X
- X* first we check, if we need to patch, then we check was the patch successful
- X
- X* Stop the clicks
- X* fix 'bchg #$01,$41(a3)' to 'bset #$01,$41(a3)'
- X lea $104(a2),a0
- X cmpi.w #$086b,(a0)
- X bne.s 1$
- X move.w #$08eb,(a0)
- X1$
- X cmpi.w #$08eb,(a0)
- X bne.s 2$
- X subq #1,d7
- X
- X2$
- X* Repair trackdisk read/write bug originally at $feaf9c (1.3)
- X* fix 'cmp.l $8000,d0' to 'cmpi.l #$8000,d0'
- X lea $1a38(a2),a0
- X cmpi.w #$b0b9,(a0)
- X bne.s 3$
- X move.w #$0c80,(a0)
- X3$
- X cmpi.w #$0c80,(a0)
- X bne.s 4$
- X subq #1,d7
- X4$
- X* enable interrupts
- X CALLSYS Enable
- X
- X move.l d7,d0 if d7 = 0, patching was succesful
- X beq.s exit
- X moveq #15,d0 patches failed??
- X
- Xexit
- X tst.b d0
- X beq.s real_exit
- X
- X* print the usage text
- X move.l d0,-(sp) push the return code
- X lea dosname(pc),a1
- X moveq #0,d0
- X CALLSYS OpenLibrary
- X tst.l d0
- X beq.s 2$
- X move.l d0,a5
- X exg a5,a6
- X jsr LVOOutput(a6)
- X move.l d0,d1
- X beq.s 1$
- X lea usage(pc),a0
- X move.l a0,d2
- X moveq #usagelen,d3
- X jsr LVOWrite(a6)
- X1$
- X exg a5,a6
- X move.l a5,a1
- X CALLSYS CloseLibrary
- X2$
- X move.l (sp)+,d0 pop the return code
- X
- Xreal_exit
- X rts
- X
- X
- X
- X* The following routines are borroved from SetCPU1.6 sources.
- X* I optimized the code a slightly to make my program smaller than 488
- X* bytes, because otherwise it would have taken 1+2 disk blocks using OFS.
- X* I removed also the 68040 check, because at this context we don't need
- X* to know whether there is exactly '030 or '040 as both have MMU.
- X
- X
- X;======================================================================
- X;
- X; This routine checks CPU flags early in ExecBase for extended
- X; CPUs that test as a 68020 under 1.3. If these flags are set,
- X; the actual CPU/MMU type test can be skipped.
- X;
- X;======================================================================
- X
- XTestFlags:
- X moveq.l #0,d0
- X* btst.b #AFB_68040,ATNFLGS(a6) ; Does the OS think an '040 is here?
- X* beq.s NoEarly40
- X* move.l #68040,d0
- X* rts
- X*NoEarly40:
- X btst.b #AFB_68030,ATNFLGS(a6) ; Does the OS think an '030 is here?
- X beq.s NoEarly30
- X move.l #68030,d0 ; Sure does...
- XNoEarly30:
- X rts
- X
- X
- X;======================================================================
- X;
- X; This function returns 0L if the system contains no MMU,
- X; 68851L if the system does contain an 68851, or the CPU number
- X; for CPUs with integral CPUs.
- X;
- X; This routine seems to lock up on at least some CSA 68020
- X; boards, though it runs just fine on those from Ronin and
- X; Commodore, as well as all 68030 boards it's been tested on.
- X;
- X; ULONG GetMMUType()
- X;
- X;======================================================================
- X
- X_GetMMUType:
- X move.l 4,a6 ; Get ExecBase
- X bsr TestFlags ; Check extended CPU types
- X tst.l d0
- X beq.s MMURealTest
- X rts
- X
- X ; For any other machine, a real test must be done. The test will
- X ; try an MMU instruction. The instruction will fail unless we're
- X ; on a "bogus MMU" system, where the FPU responds as an MMU.
- XMMURealTest:
- X movem.l a3/a4/a5,-(sp) ; Save this stuff
- X suba.l a1,a1
- X CALLSYS FindTask ; Call FindTask(0L)
- X move.l d0,a3
- X
- X move.l TC_TRAPCODE(a3),a4 ; Change the exception vector
- X lea MMUTraps(pc),a0
- X move.l a0,TC_TRAPCODE(a3)
- X
- X moveq.l #-1,d0 ; Try to detect undecode FPU
- X subq.l #4,sp ; Get a local variable
- X PMOVE_ tc,(sp) ; Let's try an MMU instruction
- X addq.l #4,sp ; Return that local
- X move.l a4,TC_TRAPCODE(a3) ; Reset exception stuff
- X movem.l (sp)+,a3/a4/a5 ; and return the registers
- X rts
- X
- X ; This is the exception code. No matter what machine we're on,
- X ; we get an exception. If the MMU's in place, we should get a
- X ; privilige violation; if not, an F-Line emulation exception.
- XMMUTraps:
- X move.l (sp)+,d0 ; Get Amiga supplied exception #
- X cmpi #11,d0 ; Is it an F-Line?
- X beq.s MMUNope ; If so, go to the fail routine
- X move.l #68851,d0 ; We have MMU
- X addq.l #4,2(sp) ; Skip the MMU instruction
- X rte
- XMMUNope:
- X moveq.l #0,d0 ; It dinna woik,
- X addq.l #4,2(sp) ; Skip the MMU instruction
- X rte
- X
- X
- X
- X* some strings
- X
- Xdosname dc.b 'dos.library',0
- Xusage dc.b 'StopClick v1.0 by IS. '
- X dc.b 'Usage: StopClick address-of-1.3-KS-FASTROM-image',10
- Xusagelen EQU *-usage
- X
- X END
- X
- END_OF_FILE
- if test 9658 -ne `wc -c <'StopClick.a'`; then
- echo shar: \"'StopClick.a'\" unpacked with wrong size!
- fi
- # end of 'StopClick.a'
- fi
- if test -f 'StopClick.uu' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'StopClick.uu'\"
- else
- echo shar: Extracting \"'StopClick.uu'\" \(709 characters\)
- sed "s/^X//" >'StopClick.uu' <<'END_OF_FILE'
- Xbegin 666 StopClick
- XM```#\P`````````!``````````````!O```#Z0```&](YX"`80`!#$J`9@A0F
- XMCW`%8```MDS?`0%3@&=$4X!R`'0`%!@,`@`@9S(,`@`[9RP,`@`)9R9V,`P"E
- XM`#EO$@B"``4,`@!!;1@,`@!&;A)V-Y0#;0SI@=*"4<C_R$I!9P1P8V!D)$$,*
- XM:B`S`!QF&@RJ-"XR(``>9A#5_``"E60,JC,T+C$`-F<$<`I@/'X"3J[_B$'J$
- XM`00,4`AK9@0PO`CK#%`(ZV8"4T=!ZAHX#%"PN68$,+P,@`Q0#(!F`E-'3J[_W
- XM@B`'9P)P#TH`9S(O`$/Z`)9P`$ZN_=A*@&<@*D#+3DZN_\0B`&<,0?H`B"0(.
- XM=DA.KO_0RTXB34ZN_F(@'TYU<``(+@`"`2EG!B`\``$)ODYU+'@`!&'H2H!GW
- XM`DYU2.<`')/)3J[^VB9`*&L`,D'Z`!HG2``R</]9C_`70@!8CR=,`#),WS@`P
- XM3G4@'PQ```MG#"`\``$,\UBO``).<W``6*\``DYS9&]S+FQI8G)A<GD`4W1O+
- XM<$-L:6-K('8Q+C`@8GD@25,N("!5<V%G93H@4W1O<$-L:6-K(&%D9')E<W,MN
- X>;V8M,2XS+4M3+49!4U123TTM:6UA9V4*``````/R7
- X``
- Xend
- Xsize 480
- END_OF_FILE
- if test 709 -ne `wc -c <'StopClick.uu'`; then
- echo shar: \"'StopClick.uu'\" unpacked with wrong size!
- fi
- # end of 'StopClick.uu'
- fi
- if test -f 'readme' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'readme'\"
- else
- echo shar: Extracting \"'readme'\" \(1115 characters\)
- sed "s/^X//" >'readme' <<'END_OF_FILE'
- XStopClick version 1.0 for SetCPU1.6 users
- X Written by Ismo Suihko, August 4, 1990
- X Released to the Public Domain
- X
- XThis program will stop the clicking of empty drives if you are using
- XSetCPU1.6 (by Dave Haynie) to load KS 1.3 ROM image to fast 32-bit ram.
- X
- XPlease check the beginning of the assembler source file for usage etc.
- XYou need to give the address of ROM image as a parameter.
- X
- XDistribution:
- X This program is freely distributable, provided that all the following
- X 4 files are included unmodified:
- X
- X size in bytes
- X README 1115 you are reading it now
- X Makefile 213 compiling instructions for Make
- X StopClick 480 binary
- X StopClick.a 9658 source
- X
- XTo compile, you need also file setcpu.i from SetCPU1.6 sources.
- X
- X
- XDisclaimer:
- X Can I say shortly: "Standard disclaimers apply"
- X
- XIf you have comments about my program (like/dislike/etc), then email them to
- X Internet: isuihko@ujocs.joensuu.fi (try this address first)
- X Bitnet: 06560L@FINUJO.BITNET
- X
- XIf you don't have access to electronic mail systems, then you can try
- X Ismo Suihko
- X Roivas
- X 81999 Joensuu
- X FINLAND
- END_OF_FILE
- if test 1115 -ne `wc -c <'readme'`; then
- echo shar: \"'readme'\" unpacked with wrong size!
- fi
- # end of 'readme'
- fi
- echo shar: End of archive 1 \(of 1\).
- cp /dev/null ark1isdone
- MISSING=""
- for I in 1 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have the archive.
- rm -f ark[1-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
- --
- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
- Mail comments to the moderator at <amiga-request@uunet.uu.net>.
- Post requests for sources, and general discussion to comp.sys.amiga.
-